#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/debugfs.h>
#include<linux/pci.h>
#include<linux/init.h>
#include<linux/debugfs.h>
#include<linux/dim.h>

static struct dentry *dir = NULL;
static unsigned int debugfs_hello;
static u32 sum = 0;

static int
add_write(void *data, u64 value)
{
    sum += value;
    return 0;
}

DEFINE_SIMPLE_ATTRIBUTE(add_ops, NULL, add_write, "%llu\n");

static __init int init(void)
{
    struct dentry *tmp_dir = NULL;
    dir = debugfs_create_dir("debugfs_hello", NULL);
    if (!dir) {
        printk(KERN_ALERT "debugfs_create_dir failed\n");
        return -1;
    }
    /*mode: rw*/
    debugfs_create_u32("hello", 0666, dir, &debugfs_hello);
    /*mode: w*/
    debugfs_create_file("add", 0222, dir, NULL, &add_ops);
    /*mode: r*/
    debugfs_create_u32("sum", 0444, dir, &sum);
    return 0;
}

static void __exit exit(void)
{
    printk(KERN_INFO "Exit debugfs_hello module\n");
    debugfs_remove_recursive(dir);
    dir = NULL;
}

module_init(init);
module_exit(exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("Debugfs hello examle");
/*
0666:
第一位0表示是一个8进制数
第二个数6是文件拥有者的读写，执行权限。
第三个数6是文件拥有者同组用户读写，执行权限
第三个数6是其它用户读写，执行权限

6：
二进制0110

第一位在权限中总是0，
第二位在权限中为0表示文件不可以被读，为1表示可以被读。
第三位在权限中为0表示文件不可以被写，为1表示可以被写。
第四位在权限中为0表示文件不可以被执行，为1表示可以被执行。
*/